﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NUnit.Framework;
using Spring.Context;
using Spring.Context.Support;
using AdminCondominio.Negocio;
using AdminCondominio.Dominio;

namespace AdminCondominio.Pruebas
{
    [TestFixture]
    public class TestCuotaService
    {

        private IApplicationContext Spring;

        [TestFixtureSetUp]
        public void InicializarPruebas()
        {
            //"assembly://assembly/namespace/capaPersistencia.xml",
            Spring = new XmlApplicationContext(
                "assembly://AdminCondominio/AdminCondominio/capaPersistencia.xml",
                "assembly://AdminCondominio/AdminCondominio/capaNegocio.xml"
                );
        }
        
        [Test]
        public void TestRegistrarCuota()
        {                        
            //Asignar los valores
            Cuota cuotaACrear = new Cuota();
            cuotaACrear.Vivienda = new Vivienda();
            
            cuotaACrear.Vivienda.CoVivienda = 1;//Codigo de la vivienda a asignar la cuota
            cuotaACrear.TxPeriodo = "05";//Periodos mensuales
            cuotaACrear.Importe = (decimal)499.99;
            cuotaACrear.FeVencimiento = DateTime.Now;//Fecha de registro de la cuota
            cuotaACrear.Estado = "P";//P => Pendiente; C => Cancelado;
            
            //Obtenemos las intancias del spring.net
            CuotaService cuotaService = (CuotaService)Spring.GetObject("cuotaService");
            Assert.NotNull(cuotaService);

            //Validamos el registro de la cuota
            Cuota cuota = null;
            Assert.DoesNotThrow(delegate
            {
                cuota = cuotaService.RegistrarCuota(cuotaACrear);
            });
            Assert.NotNull(cuota);
            Assert.Greater(cuota.CoCuota, 0);

            //Validamos que no se vuelva a registrar la cuota, en el mismo periodo y mes para una vivienda
            Cuota Repetircuota = null;
            Assert.Throws<Exception>(delegate
            {
                Repetircuota = cuotaService.RegistrarCuota(cuotaACrear);
            });
            Assert.Null(Repetircuota);
        }

        [Test]
        public void TestListarCuotasPendientes()
        {           
            //Obtenemos la instancia de spring.net
            CuotaService cuotaService = (CuotaService)Spring.GetObject("cuotaService");
            Assert.NotNull(cuotaService);

            //Validamos que nos traiga el listado de cuotas pendientes una vivienda
            ICollection<Cuota> cuota = null;
            Assert.DoesNotThrow(delegate
            {
                cuota = cuotaService.ConsultarCuotasPendientesxVivienda(1, "P");
            });
            Assert.NotNull(cuota);
            Assert.That(cuota.Count > 0);
            
            //Validamos que nos de un error al tratar de obtener la cuota de una vivienda que no existe
            ICollection<Cuota> cuotaError = null;
            Assert.Throws<Exception>(delegate
            {
                cuotaError = cuotaService.ConsultarCuotasPendientesxVivienda(399, "P");//codigo de vivienda que no existe
            });
            Assert.Null(cuotaError);
        }


        [Test]
        public void TestPagarCuota()
        {
            //Asignar los valores
            Cuota cuotaAPagar = new Cuota();
            cuotaAPagar.Vivienda = new Vivienda();

            cuotaAPagar.CoCuota = 2; // codigo de la cuota a pagar            
            cuotaAPagar.Vivienda.CoVivienda = 1; //codigo de la vivienda
            cuotaAPagar.TxPeriodo = "05"; // nro de periodo               
            cuotaAPagar.Estado = "C";//P => Pendiente; C => Cancelado;
            cuotaAPagar.TipoPago = new TipoPago();
            cuotaAPagar.TipoPago.CoTipoPago = 1;
            cuotaAPagar.FecPago = DateTime.Now;

            //Obtenemos la instancia de spring.net
            CuotaService cuotaService = (CuotaService)Spring.GetObject("cuotaService");
            Assert.NotNull(cuotaService);

            //Validamos los que se pague la cuota correctamente
            ICollection<Cuota> cuota = null;
            Assert.DoesNotThrow(delegate
            {
                cuota = cuotaService.PagarCuota(cuotaAPagar);
            });
            Assert.NotNull(cuota);
            
            //Validamos que no se pague la cuota dos veces
            ICollection<Cuota> Repetircuota = null;
            Assert.Throws<Exception>(delegate
            {
                Repetircuota = cuotaService.PagarCuota(cuotaAPagar);
            });
            Assert.Null(Repetircuota);
        }


    }
}